/**
 * javascript 不存在块作用域 ， 全局作用域/函数作用域。
 */

if (2 > 1) {
    var name = 12;
}
console.log(name);//全局作用域12


/**
 * 作用域+执行上下文环境
 *
 * 作用域是在函数创建的时候确定的。(注：不是调用的时候，只要你创建了函数，不管调用否它都有自己独立的作用域。)
 *      作用域：分为全局作用域、函数作用域
 *
 * 上下文环境是在调用的时候创建的。例如函数传的参数，如果不调用，怎么知道参数的值。
 *
 * 两者结合：一个作用域没有包含过上下文环境因为函数没有被调用过。
 *      一个作用域包含一个上下文环境，调用完后销毁。
 *      一个作用域包含多个上下文环境(闭包)，调用后没有立即销毁，因为匿名函数闭包还没执行。此时另一个人调用该函数创建一个新的上下文，所以可能包含多个。
 *
 *
 * 自由变量：就是不在当前作用域中定义的值。
 *
 * 作用域中的值：自由变量的是在创建函数时候确定的如下args。本身变量的只是在调用时候创建上下文环境时确定的如下x。
 *
 * this 精髓：谁调用的函数this就指向谁。
 */


var name = '123';

var obj5 = {
    name: 'hello',
    fa: function () {
        console.log(this.name);    //'hello'
        var args = '1,2,3';

        function a(x) {
            console.log(this.name);    //123
            console.log(args);  //1,2,3
            console.log(x);     //1

            function ab(x) {
                console.log(this.name);    //123
                console.log(args);  //1,2,3
                console.log(x);     //2
            }

            ab(2);

        }

        a(1);
    }
};
obj5.fa();